#ifndef __PREFERENCES_STM32_H__
#define __PREFERENCES_STM32_H__

#include <cstdint>
#include "preferences.h"
#include "prefs_ee.h"

class PreferencesSTM32 : public Preferences
{
public:
    PreferencesSTM32() {}

    virtual ~PreferencesSTM32()
    {
        end();
    }

    /// @brief 初始化PreferencesSTM32
    /// @param size 指定使用的区域大小，默认为1024byte
    /// @return 初始化成功返回true，否则返回false
    bool begin(size_t size = 1024)
    {
        if (__buffer != nullptr)
        {
            return false;
        }
        // 分配内存并初始化PreferencesSTM32
        __size = size;
        __buffer = new uint8_t[size];
        if (prefs_ee_init(__buffer, size))
        {
            prefs_ee_read();
            Preferences::deserialize(__buffer);
            return true;
        }
        end(); // 初始化失败，释放内存并返回false
        return false;
    }

    /// @brief 保存PreferencesSTM32中的数据
    /// @return 保存成功返回实际保存的字节数，否则返回0
    size_t save()
    {
        if (__buffer == nullptr)
        {
            return 0;
        }
        Preferences::serialize(&__buffer, &__size);
        prefs_ee_write();
        return __size;
    }

    /// @brief 结束PreferencesSTM32的使用，释放内存
    void end()
    {
        if (__buffer != nullptr)
        {
            delete[] __buffer;
            __buffer = nullptr;
        }
    }

private:
    uint8_t *__buffer{nullptr};
    size_t __size{0};
};

#endif // __PREFERENCES_STM32_H__